<!DOCTYPE html>
<meta charset=utf-8>
<title>《深入 Python 3》中有何新内容</title>
<!--[if IE]><script src=j/html5.js></script><![endif]-->
<link rel=stylesheet href="dip3.css">
<style>
body{counter-reset:h1 -1}
h3:before{content:''}
</style>
<link rel=stylesheet media='only screen and (max-device-width: 480px)' href="http://woodpecker.org.cn/diveintopython3/mobile.css">
<link rel=stylesheet media=print href="http://woodpecker.org.cn/diveintopython3/print.css">
<meta name=viewport content='initial-scale=1.0'>
<form action=http://www.google.com/cse><div><input type=hidden name=cx value=014021643941856155761:l5eihuescdw><input type=hidden name=ie value=UTF-8>&nbsp;<input type=search name=q size=25 placeholder="powered by Google&trade;">&nbsp;<input type=submit name=sa value=Search></div></form>
<p>您在这里：<a href="index.html">首页</a> <span class=u>&#8227;</span> <a href="table-of-contents.html#whats-new">深入 Python 3</a> <span class=u>&#8227;</span>
<h1>《深入 Python 3》中有何新内容</h1>
<blockquote class=q>
<p><span class=u>&#x275D;</span> 这不正是我们进来的地方吗？ <span class=u>&#x275E;</span><br>&mdash; 《迷墙》
</blockquote>
<p id=toc>&nbsp;
<h2 id=divingin><i>又叫做</i> &#8220;the minus level&#8221;</h2>

<p class=f>你读过原版的 &#8220;<a href=http://diveintopython.org/>深入 Python</a>&#8221; 并可能甚至买了纸版的。（谢谢！）你差不多已经了解 Python 2 了。你准备好了投入到 Python 3 里面。&hellip; 如果所有这些都成立，继续读。（如果没有一个是成立的，你最好<a href="installing-python.html">从头开始</a>。）

<p>Python 3 提供了一个脚本叫做 <code>2to3</code>。学习它。喜欢它。使用它。<a href="porting-code-to-python-3-with-2to3.html">用 <code>2to3</code> 移植代码到 Python 3</a> 是一个有关 <code>2to3</code> 工具能够自动整理的所有东西的参考手册。很多这些东西都是语法的变更，因此了解 Python 3 里面许多的语法变更是一个好的起点。（<code>print</code> 现在是一个函数，<code>`x`</code> 不能使用，等等。）

<p><a href="case-study-porting-chardet-to-python-3.html">案例分析：移植 <code>chardet</code> 到 Python 3</a> 记录了我努力（最终成功）把一个不平常的库从 Python 2 移植到 Python 3 的过程。它也许能帮助你；也许不能。这里存在一个相当陡的学习曲线，由于你首先需要稍微理解一下这个库，那样你才可以理解为什么它会损坏以及我如何修复它的。围绕字符串有很多损坏的地方。说到这个&hellip;

<p>字符串。吆。从哪儿开始呢。Python 2 有 &#8220;strings&#8221; 和 &#8220;Unicode strings&#8221;。Python 3 有 &#8220;bytes&#8221; 和 &#8220;strings&#8221;。也就是说，现在所有字符串都是 Unicode 的字符串，那么如果你想处理一个字节包，你可以使用新的 <code>bytes</code> 类型。Python 3 <em>从不会</em>在 strings 和 bytes 之间进行隐式的转换，因此在任何时候如果你不确信你拥有的是什么类型，你的代码几乎无疑的将会出问题。阅读 <a href="strings.html">Strings 的章节</a> 了解更多细节信息。 

<p>贯穿整个这本书，Bytes 和 strings 的对比会一次又一次的出现。

<ul>
<li>在<a href="files.html">文件</a>这章，你将了解到通过&#8220;二进制&#8221;模式和&#8220;文本&#8221;模式读取文件的区别；在文本模式下读取（和写入！）文件需要提供一个 <code>encoding</code> 参数。一些文本文件方法按照字符来计数，而另一些方法按照字节计数。如果你的代码采取一个字符等于一个字节的方式，那么在多字节表示一个字符的情况下<em>将会</em>出问题。
<li>在 <a href="http-web-services.html"><abbr>HTTP</abbr> Web 服务</a>这章，<code>httplib2</code> 模块通过 <abbr>HTTP</abbr> 获取头信息和数据。<abbr>HTTP</abbr> 头信息返回的是字符串，而 <abbr>HTTP</abbr> 正文则返回的是字节。
<li>在<a href="serializing.html">序列化 Python 对象</a>这章，你将了解到为什么 Python 3 里面的 <code>pickle</code> 模块定义了一个和 Python 2 向后不兼容的新的数据类型。（提示：这就是因为字节和字符串的原因。） 同样 <abbr>JSON</abbr> 也根本不支持字节类型。我将向你展示如何解决这个问题。
<li>在<a href="case-study-porting-chardet-to-python-3.html">案例分析：移植 <code>chardet</code> 到 Python 3</a>这章，到处都是一大堆一大堆关于字节和字符串的东西。
</ul>

<p>即使你不关心 Unicode （但实际上你会的），你也会想阅读一下 <a href="strings.html#formatting-strings">Python 3 里面的字符串格式</a>，这和 Python 2 里面的完全不一样。

<p>迭代在 Python 3 里面无处不在，比起五年之前我写&#8220;深入Python&#8221; 的时候，我现在能更好的理解它们。你也需要理解他们，因为过去经常在 Python 2 里面返回列表的很多函数，在 Python 3 里面将返回迭代。至少，你应该阅读一下<a href="iterators.html#a-fibonacci-iterator">迭代章节的下半部分</a>和<a href="advanced-iterators.html#generator-expressions">高级迭代章节的下半部分</a>。

<p>根据大家的要求，我已经添加了一个关于<a href="special-method-names.html">特殊方法名称</a>的附录，有点像<a href=http://www.python.org/doc/3.1/reference/datamodel.html#special-method-names> Python 文档的 &#8220;数据模型&#8221;章节</a>但是包含更多的内容。

<p>当我在撰写&#8220;深入 Python&#8221;的时候，所有可用的 XML 库都很糟糕。接着 Fredrik Lundh 编写了非常优秀的 <a href=http://effbot.org/zone/element-index.htm>ElementTree</a>。Python 的专家们聪明的把 <a href=http://docs.python.org/3.1/library/xml.etree.elementtree.html>ElementTree 变成了标准库的一部分</a>，然后现在它构成了<a href="xml.html">我的新的 XML 章节</a>的基础。解析 XML 的那些老的方式仍然可用，但是你应该避免使用它们，因为他们很糟糕！

<p>除此之外，还有个关于 Python 的新东西&nbsp;&mdash;&nbsp;不是语言上的，而是社区中的&nbsp;&mdash;&nbsp;像 <a href=http://pypi.python.org/>Python 包装索引</a>(PyPI)的出现。Python 提供了实用工具类用来将你的代码打包成标准格式，并分发那些包到 PyPI 中。阅读 <a href="packaging.html">打包 Python 库</a>了解详细信息。

<p class=c>&copy; 2001&ndash;9 <a href="about.html">Mark Pilgrim</a>
